Area2D でダメージ床の判定を作る
乗るとゲームオーバになる棘を作って
ゲームの難易度を上げる
Area2D
物理オブジェクトではないが、接触判定を持つNode
かならずCollisionShapeを持つ
あたっても、物体の動きを止めない
ただし、衝突や重なりは検出する
ゴールゾーンや、回復エリア・ダメージエリアを実装するのに役立つ
Spike Sceneを作る
新規Scene > Custom Node > Area2D
下に以下の2つを作る
Sprite
CollisionPolygon2D
スクリプトをアタッチ、シグナルを接続
Area2Dを選び、body_entered()をArea2Dのスクリプトに接続する
area_endterd() : Area2Dが入ってきたときに使う
body_enterd(): RigitBody, KinematicBodyなどが入ってきたときに使う
Collisionの設定
レイヤー3に"Hazards"と名付ける
PlayerのMaskとSpikeのMaskをお互い衝突するようにしておく
LevelにSpike sceneをインスタンス化
https://gyazo.com/da368f1d4dce9304c2f96af5f4a0613c
空のNode を作ってそこに全部入れる
鎖マーク > 選択
ファイルシステムから.tscnを選択してドロップ
Bunnyにhurt()を実装
hurt = 傷つく
ライフとダメージ関数を実装して、
棘に触れたらライフが減って、ダメージモーションが入る(jumpする)
code: py
var lives = 3
func hurt():
motion.y = -(JUMP_SPEED)
position.y += 1
lives -= 1
if lives <= 0:
end_game()
ただし、この状態だとダメージを受けたときに飛び上がる動きができない。
物理プロセスは60fpsで回っており、apply_gravity()によって
地面に接しているときのy方向の速度が0にされてしまう。
yield(get_tree(), "idle_frame")
物理プロセスが1回実行されるのを待つ
すると、次のフレームまでの待ち時間に入ったシグナルの"idle_frame"発火する。
フレーム待ちの間は割り込まれないので、
そこで速度などを変更すれば、次の物理プロセスまで邪魔が入らずにプロパティをいじれる
Spike側のスクリプトから、Playerのメソッド呼び出し
entered_body(body) signalは、あたった相手のNodeを取得できる。
code: py
func _on_Spike_Top_body_entered(body):
if body.has_method("hurt"):
body.hurt()
body = Player Node (extends KinematicBody2D)
衝突相手を見分ける
body.has_method("methot")
メソッドさえ持っていればいいので、ポリモーフィズム向き
if body is Class:
isは、Class もしくは Classを継承しているときtrueになる
Classの部分は、RigidBodyだったりKinematicだったり
まとめ
Area2D
物理的な作用を持たない衝突判定エリア
Layer & Mask
自分のいる層の位置 & 衝突する相手の層
yield
関数実行時の状態を保存して、あとから再開できる
object, signalを指定すると、そのobjectでsignalが発生したら自動で再開する
コールバックに便利
y.resume() で手動で再開することもできる